home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 1 / The Arsenal Files (Arsenal Computer).ISO / genprog / msjfeb94.exe / WIN32QA.ZIP / DFSRC.C next >
C/C++ Source or Header  |  1994-02-01  |  4KB  |  143 lines

  1. /*************************************************************
  2. Module name: DFSrc.C
  3. Notices: Copyright (c) 1993 Jeffrey Richter
  4. *************************************************************/
  5.  
  6.  
  7. #include <windows.h>
  8.  
  9. #include "DFSrc.h"
  10.  
  11.  
  12. //////////////////////////////////////////////////////////////
  13.  
  14.  
  15. // The UNDOCUMENTED data structure necessary for creating
  16. // a Win32 drop-file source application:
  17.  
  18. typedef struct {
  19.     WORD  wSize;                // Size of data structure
  20.     POINT ptMousePos;            // Position of mouse cursor
  21.     BOOL  fInNonClientArea;    // Was the mouse in the
  22.                                     // window's non-client area?
  23.     BOOL fUnicode;                // Are the pathnames in Unicode?
  24. } DROPFILESTRUCT, *LPDROPFILESTRUCT;
  25.  
  26.  
  27. //////////////////////////////////////////////////////////////
  28.  
  29.  
  30. HDROP DragCreateFiles (LPPOINT lpptMousePos, 
  31.     BOOL fInNonClientArea, BOOL fUnicode) {
  32.  
  33.     HDROP hDrop;
  34.    LPDROPFILESTRUCT lpDropFileStruct;
  35.  
  36.     // Allocate dynamic memory for the DROPFILESTRUCT data
  37.     // structure and for the extra zero-character identifying
  38.     // that there are no pathnames in the block yet.
  39.     hDrop = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 
  40.        sizeof(DROPFILESTRUCT) + 
  41.        (fUnicode ? sizeof(WCHAR) : sizeof(char)));
  42.  
  43.    // If unsuccessful, return NULL
  44.    if (hDrop == NULL) 
  45.        return(hDrop);
  46.  
  47.    // Lock block and initialize the data members
  48.    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
  49.    lpDropFileStruct->wSize = sizeof(DROPFILESTRUCT);
  50.    lpDropFileStruct->ptMousePos = *lpptMousePos;
  51.    lpDropFileStruct->fInNonClientArea = fInNonClientArea;
  52.    lpDropFileStruct->fUnicode = fUnicode;
  53.  
  54.     // Unlock the block and return its handle.
  55.    GlobalUnlock(hDrop);
  56.    return(hDrop);
  57. }
  58.  
  59.  
  60. //////////////////////////////////////////////////////////////
  61.  
  62.  
  63. HDROP DragAppendFile (HDROP hDrop, LPBYTE lpbPathname) {
  64.     LPDROPFILESTRUCT lpDropFileStruct;
  65.    LPSTR szPathA;
  66.    LPWSTR szPathW;
  67.     int nOffsetOfNewPathname, nPathSize;
  68.  
  69.    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
  70.  
  71.    // Point to first pathname in list
  72.    szPathW = (LPWSTR) 
  73.        (szPathA = (LPSTR) (&lpDropFileStruct[1]));
  74.  
  75.     if (lpDropFileStruct->fUnicode) {
  76.  
  77.        // Search for a pathname where 1st char is a zero-char
  78.        while (*szPathW) {    // While the 1st char is non-zero
  79.             while (*szPathW)    // Find end of current path
  80.                 szPathW++;
  81.           szPathW++;            // Skip over the zero-char
  82.        }
  83.  
  84.         // Get the offset from the beginning of the block 
  85.         // where the new pathname should go
  86.         nOffsetOfNewPathname = 
  87.             ((LPBYTE) szPathW - (LPBYTE) lpDropFileStruct);
  88.  
  89.         // Get the number of bytes needed for the new pathname,
  90.         // it's terminating zero-char, and the zero-length 
  91.         // pathname that marks the end of the list of pathnames
  92.         nPathSize = sizeof(WCHAR) * 
  93.             (wcslen((LPCWSTR) lpbPathname) + 2);
  94.     } else {
  95.        // Search for a pathname where 1st char is a zero-char
  96.        while (*szPathA) {    // While the 1st char is non-zero
  97.             while (*szPathA)    // Find end of current path
  98.                 szPathA++;
  99.           szPathA++;            // Skip over the zero-char
  100.        }
  101.  
  102.         // Get the offset from the beginning of the block 
  103.         // where the new pathname should go
  104.         nOffsetOfNewPathname = 
  105.             ((LPBYTE) szPathA - (LPBYTE) lpDropFileStruct);
  106.  
  107.         // Get the number of bytes needed for the new pathname,
  108.         // it's terminating zero-char, and the zero-length 
  109.         // pathname that marks the end of the list of pathnames
  110.         nPathSize = sizeof(char) * (strlen(lpbPathname) + 2);
  111.     }
  112.  
  113.    GlobalUnlock(hDrop);
  114.  
  115.    // Increase block size to accommodate new pathname
  116.    hDrop = GlobalReAlloc(hDrop, 
  117.        nPathSize + nOffsetOfNewPathname, 
  118.        GMEM_MOVEABLE | GMEM_ZEROINIT);
  119.  
  120.    // Return NULL if insufficient memory
  121.    if (hDrop == NULL) 
  122.        return(hDrop);
  123.  
  124.    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
  125.  
  126.    // Append the pathname to the end of the block
  127.     if (lpDropFileStruct->fUnicode) {
  128.        wcscpy((LPWSTR) 
  129.            ((LPSTR) lpDropFileStruct + nOffsetOfNewPathname), 
  130.            (LPCWSTR) lpbPathname);
  131.     } else {
  132.        strcpy((LPSTR)  
  133.            ((LPSTR) lpDropFileStruct + nOffsetOfNewPathname), 
  134.            lpbPathname);
  135.     }
  136.  
  137.    GlobalUnlock(hDrop);
  138.    return(hDrop);  // Return the new handle to the block
  139. }
  140.  
  141.  
  142. //////////////////////// End Of File /////////////////////////
  143.